package com.foftact.stockpe.mapper;

import com.foftact.stockpe.StockPE;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 股票估值数据Mapper接口
 * 用于数据库操作
 */
@Mapper
public interface StockPEMapper {
    /**
     * 插入单条股票估值数据
     * @param stockPE 股票估值数据
     * @return 影响行数
     */
    int insert(StockPE stockPE);

    /**
     * 批量插入股票估值数据
     * @param stockPEList 股票估值数据列表
     * @return 影响行数
     */
    int batchInsert(@Param("list") List<StockPE> stockPEList);

    /**
     * 根据股票代码和日期范围查询股票估值数据
     * @param securityCode 证券代码
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 股票估值数据列表
     */
    List<StockPE> selectByCodeAndDateRange(
            @Param("securityCode") String securityCode,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate
    );

    /**
     * 根据股票代码查询最新的一条股票估值数据
     * @param securityCode 证券代码
     * @return 股票估值数据
     */
    StockPE selectLatestByCode(@Param("securityCode") String securityCode);

    /**
     * 根据股票代码查询最近N条股票估值数据
     * @param securityCode 证券代码
     * @param limit 查询数量限制
     * @return 股票估值数据列表
     */
    List<StockPE> selectRecentByCodeAndLimit(
            @Param("securityCode") String securityCode,
            @Param("limit") int limit
    );

    /**
     * 根据股票代码和交易日期更新股票估值数据
     * @param stockPE 股票估值数据
     * @return 影响行数
     */
    int updateByCodeAndTradeDate(StockPE stockPE);

    /**
     * 根据股票代码删除所有相关数据
     * @param securityCode 证券代码
     * @return 影响行数
     */
    int deleteByCode(@Param("securityCode") String securityCode);

    /**
     * 清空表数据
     * @return 影响行数
     */
    int truncateTable();

    /**
     * 检查指定股票在指定周是否存在数据
     * @param securityCode 证券代码
     * @return 存在数量
     */
    int checkWeekDataExists(@Param("securityCode") String securityCode);

    /**
     * 检查指定股票在指定周是否存在数据
     * @param securityCode 证券代码
     * @param startOfWeek 周开始日期
     * @param endOfWeek 周结束日期
     * @return 存在数量
     */
    int checkWeekDataExists2(
            @Param("securityCode") String securityCode,
            @Param("startOfWeek") Date startOfWeek,
            @Param("endOfWeek") Date endOfWeek);
    
    /**
     * 查询指定股票近5年的估值数据
     * @param securityCode 证券代码
     * @return 近5年的股票估值数据列表
     */
    List<StockPE> selectRecentFiveYearsByCode(@Param("securityCode") String securityCode);
    
    /**
     * 插入或更新股票估值数据
     * 如果数据已存在则更新，不存在则插入
     * @param stockPE 股票估值数据
     * @return 影响行数
     */
    int insertOrUpdate(StockPE stockPE);
    
    /**
     * 删除指定天数之前的数据
     * @param days 天数
     * @return 影响行数
     */
    int deleteOldData(@Param("days") int days);
    
    /**
     * 查询所有股票估值数据
     * @return 股票估值数据列表
     */
    List<StockPE> selectAll();
    
    /**
     * 根据股票代码查询股票估值数据
     * @param securityCode 证券代码
     * @return 股票估值数据
     */
    StockPE selectBySecurityCode(@Param("securityCode") String securityCode);
}